RAII 클래스의 객체가 객체를 감싸고 있는 자원으로 변환하기 위해서,
명시적 변환(explicit conversion) 혹은 암시적 변환(implicit conversion)을 사용한다.
std::shared_ptr, std::auto_ptr은 명시적 변환을 제공하는 get 멤버함수를 제공한다.
std::shared_ptr<Investment> pInv(createInvestment());
int daysHeld(const Investment* pi);
int days=daysHeld(pInv.get());
스마트 포인터 shared_ptr, auto_ptr 등은 operator->, operator*도 오버로딩되어 있다.
class Investment{
public:
bool isTaxFree() const;
};
Investment* createInvestment();
std::shared_ptr<Investment> pi1(createInvestment());
bool taxable1=!(pi1->isTaxFree());
std::auto_ptr<Investment> pi2(createInvestment());
bool taxable2=!((*pi2).isTaxFree());
암시적 변환 함수를 제공
FontHandle getFont(void);
void releaseFont(FontHandle fh);
class Font{
public:
explicit Font(FontHandle fh): f(fh) {}
~Font(){ releaseFont(f); }
FontHandle get(void) const { return f; }
operator FontHandle() const{
return f;
}
private:
FontHandle f;
};
위와 같이 암시적 변환 함수( operator FontHandle() )를 정의할 경우,
아래와 같이 사용 가능하다.
하지만 operator FontHandle을 정의하면 의도치 않게 사용될 수 있다.
원하지 않은 타입 변환이 일어날 여지를 줄이기 위해 get 등의 명시적 변환 함수를 제공하는 것이 좋음
void changeFontSize(FontHandle f, int newSize);
Font f(getFont());
int newFontSize;
changeFontSize(f.get(), newFontSize);
changeFontSize(f, newFontSize);